package org.tissou.client.DonneesAAfficher;

import org.tissou.client.Services.*;

import java.util.Date;
import java.util.List;
import java.util.ArrayList;

import com.google.gwt.user.client.rpc.IsSerializable;


/**
 * Created by IntelliJ IDEA.
 * User: Claire
 * Date: 03/03/2009
 * Time: 21:12:32
 * To change this template use File | Settings | File Templates.
 */
public class ParametresQuery implements IsSerializable {

  List<Date> dates = new ArrayList<Date>();
  List<Compte> comptes = new ArrayList<Compte>();
  List<ProprietaireInfos> proprietaires = new ArrayList<ProprietaireInfos>();
  List<MonnaieInfos> monnaies = new ArrayList<MonnaieInfos>();
  List<CategorieInfos> categories = new ArrayList<CategorieInfos>();
  int nombredeligne = -1;
  int offset = -1;
  TypeDonnee type;
  Builder builder;


  public static class Builder implements IsSerializable {
    List<Date> dates = new ArrayList<Date>();
    List<Compte> comptes = new ArrayList<Compte>();
    List<ProprietaireInfos> proprietaires = new ArrayList<ProprietaireInfos>();
    List<MonnaieInfos> monnaies = new ArrayList<MonnaieInfos>();
    List<CategorieInfos> categories = new ArrayList<CategorieInfos>();
    int nombredeligne = -1;
    int offset = -1;
    TypeDonnee type;


    public Builder setType(TypeDonnee type) {
      this.type = type;
      return this;
    }

    public Builder addDate(Date date){
      dates.add(date);
      return this;
    }

    public Builder addProprietaires(ProprietaireInfos proprietaire) {
      this.proprietaires.add(proprietaire);
      return this;
    }

    public Builder addMonnaie(MonnaieInfos monnaie){
      this.monnaies.add(monnaie);
      return this;
    }

    public Builder addCategorie(CategorieInfos categorie){
      this.categories.add(categorie);
      return this;
    }

    public Builder addCompte(Compte compte){
      comptes.add(compte);
      return this;
    }

    public Builder setNombredeligne(int nombredeligne) {
      this.nombredeligne = nombredeligne;
      return this;
    }

    public Builder setOffset(int offset) {
      this.offset = offset;
      return this;
    }

    public boolean parametresCompatibles(){
      boolean compatible = true;

      if (this.type.getVraiNom().equals("lignes compte reel")) {
        compatible = this.nombredeligne>0;
        compatible = this.offset>-1;
        compatible = compatible && this.dates.size() == 1;
        compatible = compatible && this.comptes.size() == 1;
      }
      else if (type.getVraiNom().equals("lignes compte virtuel")) {
        compatible = this.nombredeligne>0;
        compatible = this.offset>-1;
        compatible = compatible && this.dates.size() == 1;
      }
      else if (type.getVraiNom().equals("lignes dettes")) {
        compatible = compatible && this.proprietaires.size() == 1;
        compatible = compatible && this.monnaies.size() ==1;
        compatible = compatible && this.categories.size() ==1;
      }
      else if (type.getVraiNom().equals("Bilan Mensuel") || type.getVraiNom().equals("Bilan Mensuel Total")) {
          compatible = compatible && this.proprietaires.size() == 1;
          compatible = compatible && this.monnaies.size() ==1;
          compatible = compatible && this.categories.size() ==1;
          compatible = compatible && this.dates.size() == 2;
        }
      
      return compatible;
    }

    public ParametresQuery build() {
      if (!parametresCompatibles()) {
        throw new MonException("Attention parametres bien pourrites a l'horizon.");
      }
      return new ParametresQuery(dates, comptes, proprietaires, monnaies, categories, nombredeligne,  offset, type);
    }


  }

  private ParametresQuery(List<Date> dates,
                          List<Compte> comptes,
                          List<ProprietaireInfos> proprietaires,
                          List<MonnaieInfos> monnaies,
                          List<CategorieInfos> categories,
                          int nombredeligne, int offset, TypeDonnee type) {
    this.dates = dates;
    this.comptes = comptes;
    this.proprietaires = proprietaires;
    this.monnaies = monnaies;
    this.categories = categories;
    this.nombredeligne = nombredeligne;
    this.offset = offset;
    this.type = type;

  }

  public ParametresQuery() {

  }

  public List<ProprietaireInfos> getProprietaires() {
    return proprietaires;
  }

  public int getNombreProprietaire(){
    return proprietaires.size();
  }

  public List<MonnaieInfos> getMonnaies() {
    return monnaies;
  }

  public int getNombreMonnaies(){
    return monnaies.size();
  }

  public List<CategorieInfos> getCategories() {
     return categories;
   }

   public int getNombreCategories(){
     return categories.size();
   }

  public int getNombreDate(){
    return dates.size();
  }

  public int getNombreComptes(){
    return comptes.size();
  }

  public List<Date> getDates() {
    return dates;
  }

  public List<Compte> getComptes() {
    return comptes;
  }

  public int getNombredeligne() {
    return nombredeligne;
  }

  public int getOffset(){
    return offset;
  }

  
  public TypeDonnee getType() {
    return type;
  }

  public static ParametresQuery genererNouveauxParametresChangerOffset(ParametresQuery param, int nouvelOffSet){
        Builder builder = new Builder();
        for (Date d : param.getDates()){
          builder.addDate(d);
        }
        for (Compte c : param.getComptes()){
          builder.addCompte(c);
        }
        for (ProprietaireInfos p : param.getProprietaires()){
          builder.addProprietaires(p);
        }
        for (MonnaieInfos m : param.getMonnaies()){
          builder.addMonnaie(m);
        }
        for (CategorieInfos c : param.getCategories()){
          builder.addCategorie(c);
        }
        builder.setNombredeligne(param.nombredeligne);
        builder.setOffset(nouvelOffSet);
        builder.setType(param.getType());
        return builder.build();
      }
  
  public static ParametresQuery genererNouveauxParametresChangerTypeDonnee(ParametresQuery param, TypeDonnee nouveauType){
      Builder builder = new Builder();
      for (Date d : param.getDates()){
        builder.addDate(d);
      }
      for (Compte c : param.getComptes()){
        builder.addCompte(c);
      }
      for (ProprietaireInfos p : param.getProprietaires()){
        builder.addProprietaires(p);
      }
      for (MonnaieInfos m : param.getMonnaies()){
        builder.addMonnaie(m);
      }
      for (CategorieInfos c : param.getCategories()){
        builder.addCategorie(c);
      }
      builder.setNombredeligne(param.nombredeligne);
      builder.setOffset(param.getOffset());
      builder.setType(nouveauType);
      return builder.build();
    } 
}
